home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / prlgbnc1.lha / Bench / chat_parser.pl < prev    next >
Text File  |  1990-05-25  |  24KB  |  1,173 lines

  1. % generated: 19 November 1989
  2. % option(s): 
  3. %
  4. %  chat_parser
  5. %
  6. %  Fernando C. N. Pereira and David H. D. Warren
  7.  
  8. chat_parser :- string(X),
  9.                determinate_say(X,_),
  10.                fail.
  11. chat_parser.
  12.  
  13.  
  14. %  query set
  15.  
  16. string([what,rivers,are,there,?]).
  17. string([does,afghanistan,border,china,?]).
  18. string([what,is,the,capital,of,upper_volta,?]).
  19. string([where,is,the,largest,country,?]).
  20. string([which,country,'`',s,capital,is,london,?]).
  21. string([which,countries,are,european,?]).
  22. string([how,large,is,the,smallest,american,country,?]).
  23. string([what,is,the,ocean,that,borders,african,countries,
  24.     and,that,borders,asian,countries,?]).
  25. string([what,are,the,capitals,of,the,countries,bordering,the,baltic,?]).
  26. string([which,countries,are,bordered,by,two,seas,?]).
  27. string([how,many,countries,does,the,danube,flow,through,?]).
  28. string([what,is,the,total,area,of,countries,south,of,the,equator,
  29.     and,not,in,australasia,?]).
  30. string([what,is,the,average,area,of,the,countries,in,each,continent,?]).
  31. string([is,there,more,than,one,country,in,each,continent,?]).
  32. string([is,there,some,ocean,that,does,not,border,any,country,?]).
  33. string([what,are,the,countries,from,which,a,river,flows,
  34.     into,the,black_sea,?]).
  35.  
  36.  
  37. %  determinate_say
  38.  
  39. determinate_say(X,Y) :- 
  40.    say(X,Y), !.
  41.  
  42.  
  43. %-----------------------------------------------------------------------------
  44. %
  45. %  xgrun
  46. %
  47. %-----------------------------------------------------------------------------
  48.  
  49. terminal(T,S,S,x(_,terminal,T,X),X).
  50. terminal(T,[T|S],S,X,X) :-
  51.    gap(X).
  52.  
  53. gap(x(gap,_,_,_)).
  54. gap([]).
  55.  
  56. virtual(NT,x(_,nonterminal,NT,X),X).
  57.  
  58.  
  59. %----------------------------------------------------------------------------
  60. %
  61. %  clotab
  62. %
  63. %----------------------------------------------------------------------------
  64.  
  65. % normal form masks
  66.  
  67. is_pp(#(1,_,_,_)).
  68.  
  69. is_pred(#(_,1,_,_)).
  70.  
  71. is_trace(#(_,_,1,_)).
  72.  
  73. is_adv(#(_,_,_,1)).
  74.  
  75. trace(#(_,_,1,_),#(0,0,0,0)).
  76.  
  77. trace(#(0,0,1,0)).
  78.  
  79. adv(#(0,0,0,1)).
  80.  
  81. empty(#(0,0,0,0)).
  82.  
  83. np_all(#(1,1,1,0)).
  84.  
  85. s_all(#(1,0,1,1)).
  86.  
  87. np_no_trace(#(1,1,0,0)).
  88.  
  89. % mask operations
  90.  
  91. myplus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :-
  92.    or(B1,C1,D1),
  93.    or(B2,C2,D2),
  94.    or(B3,C3,D3),
  95.    or(B4,C4,D4).
  96.  
  97. minus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :-
  98.    anot(B1,C1,D1),
  99.    anot(B2,C2,D2),
  100.    anot(B3,C3,D3),
  101.    anot(B4,C4,D4).
  102.  
  103. or(1,_,1).
  104. or(0,1,1).
  105. or(0,0,0).
  106.  
  107. anot(X,0,X).
  108. anot(X,1,0).
  109.  
  110. % noun phrase position features
  111.  
  112. role(subj,_,#(1,0,0)).
  113. role(compl,_,#(0,_,_)).
  114. role(undef,main,#(_,0,_)).
  115. role(undef,aux,#(0,_,_)).
  116. role(undef,decl,_).
  117. role(nil,_,_).
  118.  
  119. subj_case(#(1,0,0)).
  120. verb_case(#(0,1,0)).
  121. prep_case(#(0,0,1)).
  122. compl_case(#(0,_,_)).
  123.  
  124.  
  125. %----------------------------------------------------------------------------
  126. %
  127. %  newg
  128. %
  129. %----------------------------------------------------------------------------
  130.  
  131. say(X,Y) :-
  132.    sentence(Y,X,[],[],[]).
  133.  
  134.  
  135. sentence(B,C,D,E,F) :-
  136.    declarative(B,C,G,E,H),
  137.    terminator(.,G,D,H,F).
  138. sentence(B,C,D,E,F) :-
  139.    wh_question(B,C,G,E,H),
  140.    terminator(?,G,D,H,F).
  141. sentence(B,C,D,E,F) :-
  142.    topic(C,G,E,H),
  143.    wh_question(B,G,I,H,J),
  144.    terminator(?,I,D,J,F).
  145. sentence(B,C,D,E,F) :-
  146.    yn_question(B,C,G,E,H),
  147.    terminator(?,G,D,H,F).
  148. sentence(B,C,D,E,F) :-
  149.    imperative(B,C,G,E,H),
  150.    terminator(!,G,D,H,F).
  151.  
  152.  
  153. pp(B,C,D,E,F,F,G,H) :-
  154.    virtual(pp(B,C,D,E),G,H).
  155. pp(pp(B,C),D,E,F,G,H,I,J) :-
  156.    prep(B,G,K,I,L),
  157.    prep_case(M),
  158.    np(C,N,M,O,D,E,F,K,H,L,J).
  159.  
  160.  
  161. topic(B,C,D,x(gap,nonterminal,pp(E,compl,F,G),H)) :-
  162.    pp(E,compl,F,G,B,I,D,J),
  163.    opt_comma(I,C,J,H).
  164.  
  165.  
  166. opt_comma(B,C,D,E) :-
  167.    `(',',B,C,D,E).
  168. opt_comma(B,B,C,C).
  169.  
  170.  
  171. declarative(decl(B),C,D,E,F) :-
  172.    s(B,G,C,D,E,F).
  173.  
  174.  
  175. wh_question(whq(B,C),D,E,F,G) :-
  176.    variable_q(B,H,I,J,D,K,F,L),
  177.    question(I,J,C,K,E,L,G).
  178.  
  179.  
  180. np(B,C,D,E,F,G,H,I,I,J,K) :-
  181.    virtual(np(B,C,D,E,F,G,H),J,K).
  182. np(np(B,C,[]),B,D,def,E,F,G,H,I,J,K) :-
  183.    is_pp(F),
  184.    pers_pron(C,B,L,H,I,J,K),
  185.    empty(G),
  186.    role(L,decl,D).
  187. np(np(B,C,D),B,E,F,G,H,I,J,K,L,M) :-
  188.    is_pp(H),
  189.    np_head(C,B,F+N,O,D,J,P,L,Q),
  190.    np_all(R),
  191.    np_compls(N,B,G,O,R,I,P,K,Q,M).
  192. np(part(B,C),3+D,E,indef,F,G,H,I,J,K,L) :-
  193.    is_pp(G),
  194.    determiner(B,D,indef,I,M,K,N),
  195.    `(of,M,O,N,P),
  196.    s_all(Q),
  197.    prep_case(R),
  198.    np(C,3+plu,R,def,F,Q,H,O,J,P,L).
  199.  
  200.  
  201. variable_q(B,C,D,E,F,G,H,x(gap,nonterminal,np(I,C,E,J,K,L,M),N)) :-
  202.    whq(B,C,I,D,F,G,H,N),
  203.    trace(L,M).
  204. variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,pp(pp(H,I),compl,J,K),L)) :-
  205.    prep(H,E,M,G,N),
  206.    whq(B,C,I,O,M,F,N,L),
  207.    trace(J,K),
  208.    compl_case(D).
  209. variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,
  210.        adv_phrase(pp(H,np(C,np_head(int_det(B),[],I),[])),J,K),L)) :-
  211.    context_pron(H,I,E,F,G,L),
  212.    trace(J,K),
  213.    verb_case(D).
  214. variable_q(B,C,compl,D,E,F,G,
  215.        x(gap,nonterminal,predicate(adj,value(H,wh(B)),I),J)) :-
  216.    `(how,E,K,G,L),
  217.    adj(quant,H,K,F,L,J),
  218.    empty(I),
  219.    verb_case(D).
  220.  
  221.  
  222. adv_phrase(B,C,D,E,E,F,G) :-
  223.    virtual(adv_phrase(B,C,D),F,G).
  224. adv_phrase(pp(B,C),D,E,F,G,H,I) :-
  225.    loc_pred(B,F,J,H,K),
  226.    pp(pp(prep(of),C),compl,D,E,J,G,K,I).
  227.  
  228.  
  229. predicate(B,C,D,E,E,F,G) :-
  230.    virtual(predicate(B,C,D),F,G).
  231. predicate(B,C,D,E,F,G,H) :-
  232.    adj_phrase(C,D,E,F,G,H).
  233. predicate(neg,B,C,D,E,F,G) :-
  234.    s_all(H),
  235.    pp(B,compl,H,C,D,E,F,G).
  236. predicate(B,C,D,E,F,G,H) :-
  237.    s_all(I),
  238.    adv_phrase(C,I,D,E,F,G,H).
  239.  
  240.  
  241. whq(B,C,D,undef,E,F,G,H) :-
  242.    int_det(B,C,E,I,G,J),
  243.    s_all(K),
  244.    np(D,C,L,M,subj,K,N,I,F,J,H).
  245. whq(B,3+C,np(3+C,wh(B),[]),D,E,F,G,H) :-
  246.    int_pron(D,E,F,G,H).
  247.  
  248.  
  249. int_det(B,3+C,D,E,F,G) :-
  250.    whose(B,C,D,E,F,G).
  251. int_det(B,3+C,D,E,F,G) :-
  252.    int_art(B,C,D,E,F,G).
  253.  
  254.  
  255. gen_marker(B,B,C,D) :-
  256.    virtual(gen_marker,C,D).
  257. gen_marker(B,C,D,E) :-
  258.    `('`',B,F,D,G),
  259.    an_s(F,C,G,E).
  260.  
  261.  
  262. whose(B,C,D,E,F,x(nogap,nonterminal,np_head0(wh(B),C,proper),
  263.       x(nogap,nonterminal,gen_marker,G))) :-
  264.    `(whose,D,E,F,G).
  265.  
  266.  
  267. question(B,C,D,E,F,G,H) :-
  268.    subj_question(B),
  269.    role(subj,I,C),
  270.    s(D,J,E,F,G,H).
  271. question(B,C,D,E,F,G,H) :-
  272.    fronted_verb(B,C,E,I,G,J),
  273.    s(D,K,I,F,J,H).
  274.  
  275.  
  276. det(B,C,D,E,E,F,G) :-
  277.    virtual(det(B,C,D),F,G).
  278. det(det(B),C,D,E,F,G,H) :-
  279.    terminal(I,E,F,G,H),
  280.    det(I,C,B,D).
  281. det(generic,B,generic,C,C,D,D).
  282.  
  283.  
  284. int_art(B,C,D,E,F,x(nogap,nonterminal,det(G,C,def),H)) :-
  285.    int_art(B,C,G,D,E,F,H).
  286.  
  287.  
  288. subj_question(subj).
  289. subj_question(undef).
  290.  
  291.  
  292. yn_question(q(B),C,D,E,F) :-
  293.    fronted_verb(nil,G,C,H,E,I),
  294.    s(B,J,H,D,I,F).
  295.  
  296.  
  297. verb_form(B,C,D,E,F,F,G,H) :-
  298.    virtual(verb_form(B,C,D,E),G,H).
  299. verb_form(B,C,D,E,F,G,H,I) :-
  300.    terminal(J,F,G,H,I),
  301.    verb_form(J,B,C,D).
  302.  
  303.  
  304. neg(B,C,D,D,E,F) :-
  305.    virtual(neg(B,C),E,F).
  306. neg(aux+B,neg,C,D,E,F) :-
  307.    `(not,C,D,E,F).
  308. neg(B,pos,C,C,D,D).
  309.  
  310.  
  311. fronted_verb(B,C,D,E,F,x(gap,nonterminal,verb_form(G,H,I,J),
  312.          x(nogap,nonterminal,neg(K,L),M))) :-
  313.    verb_form(G,H,I,N,D,O,F,P),
  314.    verb_type(G,aux+Q),
  315.    role(B,J,C),
  316.    neg(R,L,O,E,P,M).
  317.  
  318.  
  319. imperative(imp(B),C,D,E,F) :-
  320.    imperative_verb(C,G,E,H),
  321.    s(B,I,G,D,H,F).
  322.  
  323.  
  324. imperative_verb(B,C,D,x(nogap,terminal,you,x(nogap,nonterminal,
  325.         verb_form(E,imp+fin,2+sin,main),F))) :-
  326.    verb_form(E,inf,G,H,B,C,D,F).
  327.  
  328.  
  329. s(s(B,C,D,E),F,G,H,I,J) :-
  330.    subj(B,K,L,G,M,I,N),
  331.    verb(C,K,L,O,M,P,N,Q),
  332.    empty(R),
  333.    s_all(S),
  334.    verb_args(L,O,D,R,T,P,U,Q,V),
  335.    minus(S,T,W),
  336.    myplus(S,T,X),
  337.    verb_mods(E,W,X,F,U,H,V,J).
  338.  
  339.  
  340. subj(there,B,C+be,D,E,F,G) :-
  341.    `(there,D,E,F,G).
  342. subj(B,C,D,E,F,G,H) :-
  343.    s_all(I),
  344.    subj_case(J),
  345.    np(B,C,J,K,subj,I,L,E,F,G,H).
  346.  
  347.  
  348. np_head(B,C,D,E,F,G,H,I,J) :-
  349.    np_head0(K,L,M,G,N,I,O),
  350.    possessive(K,L,M,P,P,B,C,D,E,F,N,H,O,J).
  351.  
  352.  
  353. np_head0(B,C,D,E,E,F,G) :-
  354.    virtual(np_head0(B,C,D),F,G).
  355. np_head0(name(B),3+sin,def+proper,C,D,E,F) :-
  356.    name(B,C,D,E,F).
  357. np_head0(np_head(B,C,D),3+E,F+common,G,H,I,J) :-
  358.    determiner(B,E,F,G,K,I,L),
  359.    adjs(C,K,M,L,N),
  360.    noun(D,E,M,H,N,J).
  361. np_head0(B,C,def+proper,D,E,F,x(nogap,nonterminal,gen_marker,G)) :-
  362.    poss_pron(B,C,D,E,F,G).
  363. np_head0(np_head(B,[],C),3+sin,indef+common,D,E,F,G) :-
  364.    quantifier_pron(B,C,D,E,F,G).
  365.  
  366.  
  367. np_compls(proper,B,C,[],D,E,F,F,G,G) :-
  368.    empty(E).
  369. np_compls(common,B,C,D,E,F,G,H,I,J) :-
  370.    np_all(K),
  371.    np_mods(B,C,L,D,E,M,K,N,G,O,I,P),
  372.    relative(B,L,M,N,F,O,H,P,J).
  373.  
  374.  
  375. possessive(B,C,D,[],E,F,G,H,I,J,K,L,M,N) :-
  376.    gen_case(K,O,M,P),
  377.    np_head0(Q,R,S,O,T,P,U),
  378.    possessive(Q,R,S,V,[pp(poss,np(C,B,E))|V],F,G,H,I,J,T,L,U,N).
  379. possessive(B,C,D,E,F,B,C,D,E,F,G,G,H,H).
  380.  
  381.  
  382. gen_case(B,C,D,x(nogap,terminal,the,E)) :-
  383.    gen_marker(B,C,D,E).
  384.  
  385.  
  386. an_s(B,C,D,E) :-
  387.    `(s,B,C,D,E).
  388. an_s(B,B,C,C).
  389.  
  390.  
  391. determiner(B,C,D,E,F,G,H) :-
  392.    det(B,C,D,E,F,G,H).
  393. determiner(B,C,D,E,F,G,H) :-
  394.    quant_phrase(B,C,D,E,F,G,H).
  395.  
  396.  
  397. quant_phrase(quant(B,C),D,E,F,G,H,I) :-
  398.    quant(B,E,F,J,H,K),
  399.    number(C,D,J,G,K,I).
  400.  
  401.  
  402. quant(B,indef,C,D,E,F) :-
  403.    neg_adv(G,B,C,H,E,I),
  404.    comp_adv(G,H,J,I,K),
  405.    `(than,J,D,K,F).
  406. quant(B,indef,C,D,E,F) :-
  407.    `(at,C,G,E,H),
  408.    sup_adv(I,G,D,H,F),
  409.    sup_op(I,B).
  410. quant(the,def,B,C,D,E) :-
  411.    `(the,B,C,D,E).
  412. quant(same,indef,B,B,C,C).
  413.  
  414.  
  415. neg_adv(B,not+B,C,D,E,F) :-
  416.    `(not,C,D,E,F).
  417. neg_adv(B,B,C,C,D,D).
  418.  
  419.  
  420. sup_op(least,not+less).
  421. sup_op(most,not+more).
  422.  
  423.  
  424. np_mods(B,C,D,[E|F],G,H,I,J,K,L,M,N) :-
  425.    np_mod(B,C,E,G,O,K,P,M,Q),
  426.    trace(R),
  427.    myplus(R,O,S),
  428.    minus(G,S,T),
  429.    myplus(O,G,U),
  430.    np_mods(B,C,D,F,T,H,U,J,P,L,Q,N).
  431. np_mods(B,C,D,D,E,E,F,F,G,G,H,H).
  432.  
  433.  
  434. np_mod(B,C,D,E,F,G,H,I,J) :-
  435.    pp(D,C,E,F,G,H,I,J).
  436. np_mod(B,C,D,E,F,G,H,I,J) :-
  437.    reduced_relative(B,D,E,F,G,H,I,J).
  438.  
  439.  
  440. verb_mods([B|C],D,E,F,G,H,I,J) :-
  441.    verb_mod(B,D,K,G,L,I,M),
  442.    trace(N),
  443.    myplus(N,K,O),
  444.    minus(D,O,P),
  445.    myplus(K,D,Q),
  446.    verb_mods(C,P,Q,F,L,H,M,J).
  447. verb_mods([],B,C,C,D,D,E,E).
  448.  
  449.  
  450. verb_mod(B,C,D,E,F,G,H) :-
  451.    adv_phrase(B,C,D,E,F,G,H).
  452. verb_mod(B,C,D,E,F,G,H) :-
  453.    is_adv(C),
  454.    adverb(B,E,F,G,H),
  455.    empty(D).
  456. verb_mod(B,C,D,E,F,G,H) :-
  457.    pp(B,compl,C,D,E,F,G,H).
  458.  
  459.  
  460. adjs([B|C],D,E,F,G) :-
  461.    pre_adj(B,D,H,F,I),
  462.    adjs(C,H,E,I,G).
  463. adjs([],B,B,C,C).
  464.  
  465.  
  466. pre_adj(B,C,D,E,F) :-
  467.    adj(G,B,C,D,E,F).
  468. pre_adj(B,C,D,E,F) :-
  469.    sup_phrase(B,C,D,E,F).
  470.  
  471.  
  472. sup_phrase(sup(most,B),C,D,E,F) :-
  473.    sup_adj(B,C,D,E,F).
  474. sup_phrase(sup(B,C),D,E,F,G) :-
  475.    sup_adv(B,D,I,F,J),
  476.    adj(quant,C,I,E,J,G).
  477.  
  478.  
  479. comp_phrase(comp(B,C,D),E,F,G,H,I) :-
  480.    comp(B,C,F,J,H,K),
  481.    np_no_trace(L),
  482.    prep_case(M),
  483.    np(D,N,M,O,compl,L,E,J,G,K,I).
  484.  
  485.  
  486. comp(B,C,D,E,F,G) :-
  487.    comp_adv(B,D,H,F,I),
  488.    adj(quant,C,H,J,I,K),
  489.    `(than,J,E,K,G).
  490. comp(more,B,C,D,E,F) :-
  491.    rel_adj(B,C,G,E,H),
  492.    `(than,G,D,H,F).
  493. comp(same,B,C,D,E,F) :-
  494.    `(as,C,G,E,H),
  495.    adj(quant,B,G,I,H,J),
  496.    `(as,I,D,J,F).
  497.  
  498.  
  499. relative(B,[C],D,E,F,G,H,I,J) :-
  500.    is_pred(D),
  501.    rel_conj(B,K,C,F,G,H,I,J).
  502. relative(B,[],C,D,D,E,E,F,F).
  503.  
  504.  
  505. rel_conj(B,C,D,E,F,G,H,I) :-
  506.    rel(B,J,K,F,L,H,M),
  507.    rel_rest(B,C,J,D,K,E,L,G,M,I).
  508.  
  509.  
  510. rel_rest(B,C,D,E,F,G,H,I,J,K) :-
  511.    conj(C,L,D,M,E,H,N,J,O),
  512.    rel_conj(B,L,M,G,N,I,O,K).
  513. rel_rest(B,C,D,D,E,E,F,F,G,G).
  514.  
  515.  
  516. rel(B,rel(C,D),E,F,G,H,I) :-
  517.    open(F,J,H,K),
  518.    variable(B,C,J,L,K,M),
  519.    s(D,N,L,O,M,P),
  520.    trace(Q),
  521.    minus(N,Q,E),
  522.    close(O,G,P,I).
  523.  
  524.  
  525. variable(B,C,D,E,F,x(gap,nonterminal,np(np(B,wh(C),[]),B,G,H,I,J,K),L)) :-
  526.    `(that,D,E,F,L),
  527.    trace(J,K).
  528. variable(B,C,D,E,F,x(gap,nonterminal,np(G,H,I,J,K,L,M),N)) :-
  529.    wh(C,B,G,H,I,D,E,F,N),
  530.    trace(L,M).
  531. variable(B,C,D,E,F,x(gap,nonterminal,pp(pp(G,H),compl,I,J),K)) :-
  532.    prep(G,D,L,F,M),
  533.    wh(C,B,H,N,O,L,E,M,K),
  534.    trace(I,J),
  535.    compl_case(O).
  536.  
  537.  
  538. wh(B,C,np(C,wh(B),[]),C,D,E,F,G,H) :-
  539.    rel_pron(I,E,F,G,H),
  540.    role(I,decl,D).
  541. wh(B,C,np(D,E,[pp(F,G)]),D,H,I,J,K,L) :-
  542.    np_head0(E,D,M+common,I,N,K,O),
  543.    prep(F,N,P,O,Q),
  544.    wh(B,C,G,R,S,P,J,Q,L).
  545. wh(B,C,D,E,F,G,H,I,J) :-
  546.    whose(B,C,G,K,I,L),
  547.    s_all(M),
  548.    np(D,E,F,def,subj,M,N,K,H,L,J).
  549.  
  550.  
  551. reduced_relative(B,C,D,E,F,G,H,I) :-
  552.    is_pred(D),
  553.    reduced_rel_conj(B,J,C,E,F,G,H,I).
  554.  
  555.  
  556. reduced_rel_conj(B,C,D,E,F,G,H,I) :-
  557.    reduced_rel(B,J,K,F,L,H,M),
  558.    reduced_rel_rest(B,C,J,D,K,E,L,G,M,I).
  559.  
  560.  
  561. reduced_rel_rest(B,C,D,E,F,G,H,I,J,K) :-
  562.    conj(C,L,D,M,E,H,N,J,O),
  563.    reduced_rel_conj(B,L,M,G,N,I,O,K).
  564. reduced_rel_rest(B,C,D,D,E,E,F,F,G,G).
  565.  
  566.  
  567. reduced_rel(B,reduced_rel(C,D),E,F,G,H,I) :-
  568.    open(F,J,H,K),
  569.    reduced_wh(B,C,J,L,K,M),
  570.    s(D,N,L,O,M,P),
  571.    trace(Q),
  572.    minus(N,Q,E),
  573.    close(O,G,P,I).
  574.  
  575.  
  576. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  577.        np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal,
  578.        verb_form(be,pres+fin,B,main),x(nogap,nonterminal,
  579.        neg(L,M),x(nogap,nonterminal,predicate(M,N,O),P))))) :-
  580.    neg(Q,M,D,R,F,S),
  581.    predicate(M,N,O,R,E,S,P),
  582.    trace(J,K),
  583.    subj_case(G).
  584. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  585.        np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal,
  586.        verb(L,M,N,O),P))) :-
  587.    participle(L,N,O,D,E,F,P),
  588.    trace(J,K),
  589.    subj_case(G).
  590. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  591.        np(G,H,I,J,K,L,M),x(gap,nonterminal,
  592.        np(np(B,wh(C),[]),B,N,O,P,Q,R),S))) :-
  593.    s_all(T),
  594.    subj_case(I),
  595.    verb_case(N),
  596.    np(G,H,U,J,subj,T,V,D,E,F,S),
  597.    trace(L,M),
  598.    trace(Q,R).
  599.  
  600.  
  601. verb(B,C,D,E,F,F,G,H) :-
  602.    virtual(verb(B,C,D,E),G,H).
  603. verb(verb(B,C,D+fin,E,F),G,H,C,I,J,K,L) :-
  604.    verb_form(M,D+fin,G,N,I,O,K,P),
  605.    verb_type(M,Q),
  606.    neg(Q,F,O,R,P,S),
  607.    rest_verb(N,M,B,C,E,R,J,S,L),
  608.    verb_type(B,H).
  609.  
  610.  
  611. rest_verb(aux,have,B,C,[perf|D],E,F,G,H) :-
  612.    verb_form(I,past+part,J,K,E,L,G,M),
  613.    have(I,B,C,D,L,F,M,H).
  614. rest_verb(aux,be,B,C,D,E,F,G,H) :-
  615.    verb_form(I,J,K,L,E,M,G,N),
  616.    be(J,I,B,C,D,M,F,N,H).
  617. rest_verb(aux,do,B,active,[],C,D,E,F) :-
  618.    verb_form(B,inf,G,H,C,D,E,F).
  619. rest_verb(main,B,B,active,[],C,C,D,D).
  620.  
  621.  
  622. have(be,B,C,D,E,F,G,H) :-
  623.    verb_form(I,J,K,L,E,M,G,N),
  624.    be(J,I,B,C,D,M,F,N,H).
  625. have(B,B,active,[],C,C,D,D).
  626.  
  627.  
  628. be(past+part,B,B,passive,[],C,C,D,D).
  629. be(pres+part,B,C,D,[prog],E,F,G,H) :-
  630.    passive(B,C,D,E,F,G,H).
  631.  
  632.  
  633. passive(be,B,passive,C,D,E,F) :-
  634.    verb_form(B,past+part,G,H,C,D,E,F),
  635.    verb_type(B,I),
  636.    passive(I).
  637. passive(B,B,active,C,C,D,D).
  638.  
  639.  
  640. participle(verb(B,C,inf,D,E),F,C,G,H,I,J) :-
  641.    neg(K,E,G,L,I,M),
  642.    verb_form(B,N,O,P,L,H,M,J),
  643.    participle(N,C,D),
  644.    verb_type(B,F).
  645.  
  646.  
  647. passive(B+trans).
  648. passive(B+ditrans).
  649.  
  650.  
  651. participle(pres+part,active,[prog]).
  652. participle(past+part,passive,[]).
  653.  
  654.  
  655. close(B,B,C,D) :-
  656.    virtual(close,C,D).
  657.  
  658.  
  659. open(B,B,C,x(gap,nonterminal,close,C)).
  660.  
  661.  
  662. verb_args(B+C,D,E,F,G,H,I,J,K) :-
  663.    advs(E,L,M,H,N,J,O),
  664.    verb_args(C,D,L,F,G,N,I,O,K).
  665. verb_args(trans,active,[arg(dir,B)],C,D,E,F,G,H) :-
  666.    verb_arg(np,B,D,E,F,G,H).
  667. verb_args(ditrans,B,[arg(C,D)|E],F,G,H,I,J,K) :-
  668.    verb_arg(np,D,L,H,M,J,N),
  669.    object(C,E,L,G,M,I,N,K).
  670. verb_args(be,B,[void],C,C,D,E,F,G) :-
  671.    terminal(there,D,E,F,G).
  672. verb_args(be,B,[arg(predicate,C)],D,E,F,G,H,I) :-
  673.    pred_conj(J,C,E,F,G,H,I).
  674. verb_args(be,B,[arg(dir,C)],D,E,F,G,H,I) :-
  675.    verb_arg(np,C,E,F,G,H,I).
  676. verb_args(have,active,[arg(dir,B)],C,D,E,F,G,H) :-
  677.    verb_arg(np,B,D,E,F,G,H).
  678. verb_args(B,C,[],D,D,E,E,F,F) :-
  679.    no_args(B).
  680.  
  681.  
  682. object(B,C,D,E,F,G,H,I) :-
  683.    adv(J),
  684.    minus(J,D,K),
  685.    advs(C,L,K,F,M,H,N),
  686.    obj(B,L,D,E,M,G,N,I).
  687.  
  688.  
  689. obj(ind,[arg(dir,B)],C,D,E,F,G,H) :-
  690.    verb_arg(np,B,D,E,F,G,H).
  691. obj(dir,[],B,B,C,C,D,D).
  692.  
  693.  
  694. pred_conj(B,C,D,E,F,G,H) :-
  695.    predicate(I,J,K,E,L,G,M),
  696.    pred_rest(B,J,C,K,D,L,F,M,H).
  697.  
  698.  
  699. pred_rest(B,C,D,E,F,G,H,I,J) :-
  700.    conj(B,K,C,L,D,G,M,I,N),
  701.    pred_conj(K,L,F,M,H,N,J).
  702. pred_rest(B,C,C,D,D,E,E,F,F).
  703.  
  704.  
  705. verb_arg(np,B,C,D,E,F,G) :-
  706.    s_all(H),
  707.    verb_case(I),
  708.    np(B,J,I,K,compl,H,C,D,E,F,G).
  709.  
  710.  
  711. advs([B|C],D,E,F,G,H,I) :-
  712.    is_adv(E),
  713.    adverb(B,F,J,H,K),
  714.    advs(C,D,E,J,G,K,I).
  715. advs(B,B,C,D,D,E,E).
  716.  
  717.  
  718. adj_phrase(B,C,D,E,F,G) :-
  719.    adj(H,B,D,E,F,G),
  720.    empty(C).
  721. adj_phrase(B,C,D,E,F,G) :-
  722.    comp_phrase(B,C,D,E,F,G).
  723.  
  724.  
  725. no_args(trans).
  726. no_args(ditrans).
  727. no_args(intrans).
  728.  
  729.  
  730. conj(conj(B,C),conj(B,D),E,F,conj(B,E,F),G,H,I,J) :-
  731.    conj(B,C,D,G,H,I,J).
  732.  
  733.  
  734. noun(B,C,D,E,F,G) :-
  735.    terminal(H,D,E,F,G),
  736.    noun_form(H,B,C).
  737.  
  738.  
  739. adj(B,adj(C),D,E,F,G) :-
  740.    terminal(C,D,E,F,G),
  741.    adj(C,B).
  742.  
  743.  
  744. prep(prep(B),C,D,E,F) :-
  745.    terminal(B,C,D,E,F),
  746.    prep(B).
  747.  
  748.  
  749. rel_adj(adj(B),C,D,E,F) :-
  750.    terminal(G,C,D,E,F),
  751.    rel_adj(G,B).
  752.  
  753.  
  754. sup_adj(adj(B),C,D,E,F) :-
  755.    terminal(G,C,D,E,F),
  756.    sup_adj(G,B).
  757.  
  758.  
  759. comp_adv(less,B,C,D,E) :-
  760.    `(less,B,C,D,E).
  761. comp_adv(more,B,C,D,E) :-
  762.    `(more,B,C,D,E).
  763.  
  764.  
  765. sup_adv(least,B,C,D,E) :-
  766.    `(least,B,C,D,E).
  767. sup_adv(most,B,C,D,E) :-
  768.    `(most,B,C,D,E).
  769.  
  770.  
  771. rel_pron(B,C,D,E,F) :-
  772.    terminal(G,C,D,E,F),
  773.    rel_pron(G,B).
  774.  
  775.  
  776. name(B,C,D,E,F) :-
  777.    opt_the(C,G,E,H),
  778.    terminal(B,G,D,H,F),
  779.    name(B).
  780.  
  781.  
  782. int_art(B,plu,quant(same,wh(B)),C,D,E,F) :-
  783.    `(how,C,G,E,H),
  784.    `(many,G,D,H,F).
  785. int_art(B,C,D,E,F,G,H) :-
  786.    terminal(I,E,F,G,H),
  787.    int_art(I,B,C,D).
  788.  
  789.  
  790. int_pron(B,C,D,E,F) :-
  791.    terminal(G,C,D,E,F),
  792.    int_pron(G,B).
  793.  
  794.  
  795. adverb(adv(B),C,D,E,F) :-
  796.    terminal(B,C,D,E,F),
  797.    adverb(B).
  798.  
  799.  
  800. poss_pron(pronoun(B),C+D,E,F,G,H) :-
  801.    terminal(I,E,F,G,H),
  802.    poss_pron(I,B,C,D).
  803.  
  804.  
  805. pers_pron(pronoun(B),C+D,E,F,G,H,I) :-
  806.    terminal(J,F,G,H,I),
  807.    pers_pron(J,B,C,D,E).
  808.  
  809.  
  810. quantifier_pron(B,C,D,E,F,G) :-
  811.    terminal(H,D,E,F,G),
  812.    quantifier_pron(H,B,C).
  813.  
  814.  
  815. context_pron(prep(in),place,B,C,D,E) :-
  816.    `(where,B,C,D,E).
  817. context_pron(prep(at),time,B,C,D,E) :-
  818.    `(when,B,C,D,E).
  819.  
  820.  
  821. number(nb(B),C,D,E,F,G) :-
  822.    terminal(H,D,E,F,G),
  823.    number(H,B,C).
  824.  
  825.  
  826. terminator(B,C,D,E,F) :-
  827.    terminal(G,C,D,E,F),
  828.    terminator(G,B).
  829.  
  830.  
  831. opt_the(B,B,C,C).
  832. opt_the(B,C,D,E) :-
  833.    `(the,B,C,D,E).
  834.  
  835.  
  836. conj(B,list,list,C,D,E,F) :-
  837.    terminal(',',C,D,E,F).
  838. conj(B,list,'end',C,D,E,F) :-
  839.    terminal(B,C,D,E,F),
  840.    conj(B).
  841.  
  842.  
  843. loc_pred(B,C,D,E,F) :-
  844.    terminal(G,C,D,E,F),
  845.    loc_pred(G,B).
  846.  
  847.  
  848. `(B,C,D,E,F) :-
  849.    terminal(B,C,D,E,F),
  850.    `(B).
  851.  
  852.  
  853. %----------------------------------------------------------------------------
  854. %
  855. %  newdic
  856. %
  857. %----------------------------------------------------------------------------
  858.  
  859. word(Word) :- `(Word).
  860. word(Word) :- conj(Word).
  861. word(Word) :- adverb(Word).
  862. word(Word) :- sup_adj(Word,_).
  863. word(Word) :- rel_adj(Word,_).
  864. word(Word) :- adj(Word,_).
  865. word(Word) :- name(Word).
  866. word(Word) :- terminator(Word,_).
  867. word(Word) :- pers_pron(Word,_,_,_,_).
  868. word(Word) :- poss_pron(Word,_,_,_).
  869. word(Word) :- rel_pron(Word,_).
  870. word(Word) :- verb_form(Word,_,_,_).
  871. word(Word) :- noun_form(Word,_,_).
  872. word(Word) :- prep(Word).
  873. word(Word) :- quantifier_pron(Word,_,_).
  874. word(Word) :- number(Word,_,_).
  875. word(Word) :- det(Word,_,_,_).
  876. word(Word) :- int_art(Word,_,_,_).
  877. word(Word) :- int_pron(Word,_).
  878. word(Word) :- loc_pred(Word,_).
  879.  
  880. `(how).
  881. `(whose).
  882. `(there).
  883. `(of).
  884. `('`').        % use ` instead of ' to help assembler
  885. `(',').    
  886. `(s).
  887. `(than).
  888. `(at).
  889. `(the).
  890. `(not).
  891. `(as).
  892. `(that).
  893. `(less).
  894. `(more).
  895. `(least).
  896. `(most).
  897. `(many).
  898. `(where).
  899. `(when).
  900.  
  901. conj(and).
  902. conj(or).
  903.  
  904. int_pron(what,undef).
  905. int_pron(which,undef).
  906. int_pron(who,subj).
  907. int_pron(whom,compl).
  908.  
  909. int_art(what,X,_,int_det(X)).
  910. int_art(which,X,_,int_det(X)).
  911.  
  912. det(the,No,the(No),def).
  913. det(a,sin,a,indef).
  914. det(an,sin,a,indef).
  915. det(every,sin,every,indef).
  916. det(some,_,some,indef).
  917. det(any,_,any,indef).
  918. det(all,plu,all,indef).
  919. det(each,sin,each,indef).
  920. det(no,_,no,indef).
  921.  
  922. number(W,I,Nb) :-
  923.    tr_number(W,I),
  924.    ag_number(I,Nb).
  925.  
  926. tr_number(nb(I),I).
  927. tr_number(one,1).
  928. tr_number(two,2).
  929. tr_number(three,3).
  930. tr_number(four,4).
  931. tr_number(five,5).
  932. tr_number(six,6).
  933. tr_number(seven,7).
  934. tr_number(eight,8).
  935. tr_number(nine,9).
  936. tr_number(ten,10).
  937.  
  938. ag_number(1,sin).
  939. ag_number(N,plu) :- N>1.
  940.  
  941. quantifier_pron(everybody,every,person).
  942. quantifier_pron(everyone,every,person).
  943. quantifier_pron(everything,every,thing).
  944. quantifier_pron(somebody,some,person).
  945. quantifier_pron(someone,some,person).
  946. quantifier_pron(something,some,thing).
  947. quantifier_pron(anybody,any,person).
  948. quantifier_pron(anyone,any,person).
  949. quantifier_pron(anything,any,thing).
  950. quantifier_pron(nobody,no,person).
  951. quantifier_pron(nothing,no,thing).
  952.  
  953. prep(as).
  954. prep(at).
  955. prep(of).
  956. prep(to).
  957. prep(by).
  958. prep(with).
  959. prep(in).
  960. prep(on).
  961. prep(from).
  962. prep(into).
  963. prep(through).
  964.  
  965. noun_form(Plu,Sin,plu) :- noun_plu(Plu,Sin).
  966. noun_form(Sin,Sin,sin) :- noun_sin(Sin).
  967. noun_form(proportion,proportion,_).
  968. noun_form(percentage,percentage,_).
  969.  
  970. root_form(1+sin).
  971. root_form(2+_).
  972. root_form(1+plu).
  973. root_form(3+plu).
  974.  
  975. verb_root(be).
  976. verb_root(have).
  977. verb_root(do).
  978. verb_root(border).
  979. verb_root(contain).
  980. verb_root(drain).
  981. verb_root(exceed).
  982. verb_root(flow).
  983. verb_root(rise).
  984.  
  985. regular_pres(have).
  986. regular_pres(do).
  987. regular_pres(rise).
  988. regular_pres(border).
  989. regular_pres(contain).
  990. regular_pres(drain).
  991. regular_pres(exceed).
  992. regular_pres(flow).
  993.  
  994. regular_past(had,have).
  995. regular_past(bordered,border).
  996. regular_past(contained,contain).
  997. regular_past(drained,drain).
  998. regular_past(exceeded,exceed).
  999. regular_past(flowed,flow).
  1000.  
  1001. rel_pron(who,subj).
  1002. rel_pron(whom,compl).
  1003. rel_pron(which,undef).
  1004.  
  1005. poss_pron(my,_,1,sin).
  1006. poss_pron(your,_,2,_).
  1007. poss_pron(his,masc,3,sin).
  1008. poss_pron(her,fem,3,sin).
  1009. poss_pron(its,neut,3,sin).
  1010. poss_pron(our,_,1,plu).
  1011. poss_pron(their,_,3,plu).
  1012.  
  1013. pers_pron(i,_,1,sin,subj).
  1014. pers_pron(you,_,2,_,_).
  1015. pers_pron(he,masc,3,sin,subj).
  1016. pers_pron(she,fem,3,sin,subj).
  1017. pers_pron(it,neut,3,sin,_).
  1018. pers_pron(we,_,1,plu,subj).
  1019. pers_pron(them,_,3,plu,subj).
  1020. pers_pron(me,_,1,sin,compl(_)).
  1021. pers_pron(him,masc,3,sin,compl(_)).
  1022. pers_pron(her,fem,3,sin,compl(_)).
  1023. pers_pron(us,_,1,plu,compl(_)).
  1024. pers_pron(them,_,3,plu,compl(_)).
  1025.  
  1026. terminator(.,_).
  1027. terminator(?,?).
  1028. terminator(!,!).
  1029.  
  1030. name(_).
  1031.  
  1032. % ===========================================================================
  1033.  
  1034. % specialised dictionary
  1035.  
  1036. loc_pred(east,prep(eastof)).
  1037. loc_pred(west,prep(westof)).
  1038. loc_pred(north,prep(northof)).
  1039. loc_pred(south,prep(southof)).
  1040.  
  1041. adj(minimum,restr).
  1042. adj(maximum,restr).
  1043. adj(average,restr).
  1044. adj(total,restr).
  1045. adj(african,restr).
  1046. adj(american,restr).
  1047. adj(asian,restr).
  1048. adj(european,restr).
  1049. adj(great,quant).
  1050. adj(big,quant).
  1051. adj(small,quant).
  1052. adj(large,quant).
  1053. adj(old,quant).
  1054. adj(new,quant).
  1055. adj(populous,quant).
  1056.  
  1057. rel_adj(greater,great).
  1058. rel_adj(less,small).
  1059. rel_adj(bigger,big).
  1060. rel_adj(smaller,small).
  1061. rel_adj(larger,large).
  1062. rel_adj(older,old).
  1063. rel_adj(newer,new).
  1064.  
  1065. sup_adj(biggest,big).
  1066. sup_adj(smallest,small).
  1067. sup_adj(largest,large).
  1068. sup_adj(oldest,old).
  1069. sup_adj(newest,new).
  1070.  
  1071. noun_sin(average).
  1072. noun_sin(total).
  1073. noun_sin(sum).
  1074. noun_sin(degree).
  1075. noun_sin(sqmile).
  1076. noun_sin(ksqmile).
  1077. noun_sin(thousand).
  1078. noun_sin(million).
  1079. noun_sin(time).
  1080. noun_sin(place).
  1081. noun_sin(area).
  1082. noun_sin(capital).
  1083. noun_sin(city).
  1084. noun_sin(continent).
  1085. noun_sin(country).
  1086. noun_sin(latitude).
  1087. noun_sin(longitude).
  1088. noun_sin(ocean).
  1089. noun_sin(person).
  1090. noun_sin(population).
  1091. noun_sin(region).
  1092. noun_sin(river).
  1093. noun_sin(sea).
  1094. noun_sin(seamass).
  1095. noun_sin(number).
  1096.  
  1097. noun_plu(averages,average).
  1098. noun_plu(totals,total).
  1099. noun_plu(sums,sum).
  1100. noun_plu(degrees,degree).
  1101. noun_plu(sqmiles,sqmile).
  1102. noun_plu(ksqmiles,ksqmile).
  1103. noun_plu(million,million).
  1104. noun_plu(thousand,thousand).
  1105. noun_plu(times,time).
  1106. noun_plu(places,place).
  1107. noun_plu(areas,area).
  1108. noun_plu(capitals,capital).
  1109. noun_plu(cities,city).
  1110. noun_plu(continents,continent).
  1111. noun_plu(countries,country).
  1112. noun_plu(latitudes,latitude).
  1113. noun_plu(longitudes,longitude).
  1114. noun_plu(oceans,ocean).
  1115. noun_plu(persons,person).  noun_plu(people,person).
  1116. noun_plu(populations,population).
  1117. noun_plu(regions,region).
  1118. noun_plu(rivers,river).
  1119. noun_plu(seas,sea).
  1120. noun_plu(seamasses,seamass).
  1121. noun_plu(numbers,number).
  1122.  
  1123. verb_form(V,V,inf,_) :- verb_root(V).
  1124. verb_form(V,V,pres+fin,Agmt) :-
  1125.    regular_pres(V),
  1126.    root_form(Agmt),
  1127.    verb_root(V).
  1128. verb_form(Past,Root,past+_,_) :-
  1129.    regular_past(Past,Root).
  1130.  
  1131. verb_form(am,be,pres+fin,1+sin).
  1132. verb_form(are,be,pres+fin,2+sin).
  1133. verb_form(is,be,pres+fin,3+sin).
  1134. verb_form(are,be,pres+fin,_+plu).
  1135. verb_form(was,be,past+fin,1+sin).
  1136. verb_form(were,be,past+fin,2+sin).
  1137. verb_form(was,be,past+fin,3+sin).
  1138. verb_form(were,be,past+fin,_+plu).
  1139. verb_form(been,be,past+part,_).
  1140. verb_form(being,be,pres+part,_).
  1141. verb_form(has,have,pres+fin,3+sin).
  1142. verb_form(having,have,pres+part,_).
  1143. verb_form(does,do,pres+fin,3+sin).
  1144. verb_form(did,do,past+fin,_).
  1145. verb_form(doing,do,pres+part,_).
  1146. verb_form(done,do,past+part,_).
  1147. verb_form(flows,flow,pres+fin,3+sin).
  1148. verb_form(flowing,flow,pres+part,_).
  1149. verb_form(rises,rise,pres+fin,3+sin).
  1150. verb_form(rose,rise,past+fin,_).
  1151. verb_form(risen,rise,past+part,_).
  1152. verb_form(borders,border,pres+fin,3+sin).
  1153. verb_form(bordering,border,pres+part,_).
  1154. verb_form(contains,contain,pres+fin,3+sin).
  1155. verb_form(containing,contain,pres+part,_).
  1156. verb_form(drains,drain,pres+fin,3+sin).
  1157. verb_form(draining,drain,pres+part,_).
  1158. verb_form(exceeds,exceed,pres+fin,3+sin).
  1159. verb_form(exceeding,exceed,pres+part,_).
  1160.  
  1161. verb_type(have,aux+have).
  1162. verb_type(be,aux+be).
  1163. verb_type(do,aux+ditrans).
  1164. verb_type(rise,main+intrans).
  1165. verb_type(border,main+trans).
  1166. verb_type(contain,main+trans).
  1167. verb_type(drain,main+intrans).
  1168. verb_type(exceed,main+trans).
  1169. verb_type(flow,main+intrans).
  1170.  
  1171. adverb(yesterday).
  1172. adverb(tomorrow).
  1173.